home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 235 / Issue 235 - September 2007 - DPCS0907DVD.ISO / Extras / NetObjects Fusion / NOF10.exe / data1.cab / FSI / lib / nof / text / DateFormat.js next >
Encoding:
Text File  |  2007-04-11  |  15.4 KB  |  509 lines

  1. /****i* SOURCE_FILE/INFO
  2.   *
  3.   * NAME
  4.   *  DateFormat.js
  5.   *
  6.   * USAGE
  7.   *  Part of Netobjects JavaScript Library.
  8.   *
  9.   * COPYRIGHT
  10.   *  Copyright ⌐ 2000-2005 Website Pros, Inc.
  11.   *  All Rights Reserved.
  12.   *
  13.   *  This is an unpublished work protected by Website Pros, Inc.
  14.   *  as a trade secret, and is not to be used or disclosed except as
  15.   *  expressly provided in a written license agreement executed by
  16.   *  you and Website Pros, Inc.
  17.   *
  18.   *      <copyright@websitepros.com>
  19.   *
  20.   * NOTES
  21.   *  JavaScript code.
  22.   *
  23.   *****/
  24.  
  25. if (!IS.isModuleInitialized("IS.NOF.TEXT.DateFormat"))
  26.   
  27.   /****h* NOF_JavaScript_Library/NOF.TEXT.DateFormat
  28.     *
  29.     * NAME
  30.     *  NOF.TEXT.DateFormat
  31.     *
  32.     * DESCRIPTION
  33.     *
  34.     * <code>DateFormat</code> is a class which provides a simple way to 
  35.     * format a Date using locale specific settings.
  36.     * Usage sample:
  37.     * 
  38.     *   var myLocale = new NOF.UTIL.Locale("de", "DE");
  39.     *   var df = new NOF.TEXT.DateFormat(myLocale);
  40.     *   var str = df.format( new Date() );
  41.     *   alert( str );
  42.     *
  43.     * External dependencies: NOF.UTIL.Locale, NOF.UTIL.DefaultLocale, NOF.UTIL.ResourceBundle, NOF.UTIL.Exception
  44.     ****/
  45.     
  46.     /**
  47.     * Constructor
  48.     * @param locale
  49.     * @param pattern
  50.     **/
  51.   function TEXT_DateFormat(/*NOF.UTIL.Locale*/ locale, /*String*/ pattern) {
  52.         this.__proto__    = TEXT_DateFormat.prototype;
  53.         
  54.         this.locale        = locale;
  55.         this.pattern    = pattern;
  56.         
  57.         this.DateFormatSymbols = null;
  58.     }
  59.     {
  60.         var method = TEXT_DateFormat.prototype;                
  61.         method.SYMBOLS_RESOURCE = "lib/nof/text/DateFormatSettings";        
  62.         
  63.         method.TEXT_DateFormatSymbols =    function () {
  64.             this.MonthNames            = arguments[0].split(",");//["January", "February", "March", "April", "May", "June", "July", "August", "September", "Octomber", "November", "December"]
  65.             this.MonthAbbreviations    = arguments[1].split(",");//["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"]
  66.             this.DayNames            = arguments[2].split(",");//["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]
  67.             this.DayAbbreviations    = arguments[3].split(",");//["M","Tue","W","Th","F","Sat","Sun"]
  68.             this.AmPmMarkers        = arguments[4].split(",");//["am","pm"]
  69.             //this.datePattern=M/d/yy
  70.             //this.timePattern=h:mm:ss a
  71.             this.defaultPattern        = arguments[5];//M/d/yy h:mm a
  72.             this.LocalPatternChars    = arguments[6];//GyMdkHmsSEDFwWahKzZ
  73.         }
  74.         
  75.         method.PATTERN_CHARS    = "GyMdkHmsSEDFwWahKzZ";
  76.         /*
  77.         G  Era designator  Text  AD  
  78.         y  Year  Year  1996; 96  
  79.         M  Month in year  Month  July; Jul; 07  
  80.         w  Week in year  Number  27  
  81.         W  Week in month  Number  2  
  82.         D  Day in year  Number  189  
  83.         d  Day in month  Number  10  
  84.         F  Day of week in month  Number  2  
  85.         E  Day in week  Text  Tuesday; Tue  
  86.         a  Am/pm marker  Text  PM  
  87.         H  Hour in day (0-23)  Number  0  
  88.         k  Hour in day (1-24)  Number  24  
  89.         K  Hour in am/pm (0-11)  Number  0  
  90.         h  Hour in am/pm (1-12)  Number  12  
  91.         m  Minute in hour  Number  30  
  92.         s  Second in minute  Number  55  
  93.         S  Millisecond  Number  978  
  94.         z  Time zone  General time zone  Pacific Standard Time; PST; GMT-08:00  
  95.         Z  Time zone  RFC 822 time zone  -0800  
  96.         */        
  97.         
  98.         method.TEXT_CharsPatternDate    = function (/*String*/ localPatternChars, /*String*/ patternChars) {
  99.             //alert(" TEXT_CharsPatternDate localPatternChars="+localPatternChars+", patternChars="+patternChars);
  100.             this.eraChar                = localPatternChars.charAt(patternChars.indexOf("G"));
  101.             this.yearChar                = localPatternChars.charAt(patternChars.indexOf("y"));
  102.             this.monthChar                = localPatternChars.charAt(patternChars.indexOf("M"));
  103.             
  104.             this.week_in_yearChar        = localPatternChars.charAt(patternChars.indexOf("w"));
  105.             this.week_in_monthChar        = localPatternChars.charAt(patternChars.indexOf("W"));
  106.             
  107.             this.day_in_yearChar        = localPatternChars.charAt(patternChars.indexOf("D"));
  108.             this.day_in_monthChar        = localPatternChars.charAt(patternChars.indexOf("d"));
  109.             this.day_in_week_intChar    = localPatternChars.charAt(patternChars.indexOf("F"));
  110.             this.day_in_week_strChar    = localPatternChars.charAt(patternChars.indexOf("E"));
  111.             
  112.             this.hour_in_day0_23Char    = localPatternChars.charAt(patternChars.indexOf("H"));
  113.             this.hour_in_day1_24Char    = localPatternChars.charAt(patternChars.indexOf("k"));
  114.             this.hour_in_AmPm0_11Char    = localPatternChars.charAt(patternChars.indexOf("K"));
  115.             this.hour_in_AmPm1_12Char    = localPatternChars.charAt(patternChars.indexOf("h"));
  116.             
  117.             this.minuteChar                = localPatternChars.charAt(patternChars.indexOf("m"));
  118.             this.secondChar                = localPatternChars.charAt(patternChars.indexOf("s"));
  119.             this.millisChar                = localPatternChars.charAt(patternChars.indexOf("S"));
  120.             
  121.             this.markerAMPMChar            = localPatternChars.charAt(patternChars.indexOf("a"));
  122.             
  123.             this.timeZoneGeneralChar    = localPatternChars.charAt(patternChars.indexOf("z"));
  124.             this.timeZoneRFC822Char        = localPatternChars.charAt(patternChars.indexOf("Z"));
  125.             
  126.             return this;
  127.         }
  128.         
  129.         method.getDateFormatSymbols = function(/*NOF.UTIL.Locale*/ locale) {
  130.             if (locale == null) {
  131.                 locale = this.locale;
  132.             }
  133.             var propSymbols = NOF.UTIL.ResourceBundle.getBundle(this.SYMBOLS_RESOURCE, locale);            
  134.             if (propSymbols == null) {
  135.                 return null;
  136.             } else {
  137.                 return new this.TEXT_DateFormatSymbols(
  138.                     propSymbols.getProperty("MonthNames"),
  139.                     propSymbols.getProperty("MonthAbbreviations"),
  140.                     propSymbols.getProperty("DayNames"),
  141.                     propSymbols.getProperty("DayAbbreviations"),
  142.                     propSymbols.getProperty("AmPmMarkers"),
  143.                     propSymbols.getProperty("defaultPattern"),
  144.                     propSymbols.getProperty("LocalPatternChars")
  145.                     );
  146.             }
  147.         }
  148.         
  149.         /**
  150.         * Set locale        
  151.         * @param locale - specific locale         
  152.         **/
  153.         method.setLocale = function (/*NOF.UTIL.Locale*/ locale) {
  154.             if ( (locale != null) && (this.locale.equals(locale) == false) ) {
  155.                 this.locale = locale;    
  156.                 this.DateFormatSymbols = this.getDateFormatSymbols(locale);
  157.             }            
  158.         }
  159.         /**
  160.         * Get locale        
  161.         * @return locale
  162.         **/
  163.         /*NOF.UTIL.Locale*/ method.getLocale = function () {
  164.             return this.locale;
  165.         }
  166.         
  167.         /**
  168.         * Set pattern        
  169.         * @param pattern 
  170.         **/
  171.         method.setPattern = function (/*String*/ pattern) {
  172.             if ( (pattern != null) && (this.pattern != pattern) ) {
  173.                 this.pattern = pattern;                
  174.             }            
  175.         }
  176.         /**
  177.         * Get pattern
  178.         * @return pattern
  179.         **/
  180.         /*String*/ method.getPattern = function () {
  181.             return this.pattern;
  182.         }
  183.         
  184.         /**
  185.         * format a date
  186.         * @param n the number
  187.         * @param locale (optional) - specific locale 
  188.         * @return the string obtained by formating the date
  189.         **/
  190.         /*String*/ method.format = function (/*Date*/ date,/*NOF.UTIL.Locale*/ locale) {
  191.             if (date == null) return null;
  192.             
  193.             var year = date.getFullYear();    //date.getYear();
  194.             var month_in_year = date.getMonth();
  195.             var day_in_month = date.getDate();
  196.             var day_in_week_int = date.getDay();
  197.             var hours = date.getHours();
  198.             var minutes = date.getMinutes();
  199.             var seconds = date.getSeconds();
  200.             var milliseconds = date.getMilliseconds();
  201.             
  202.             var dfs = null;
  203.             if (locale != null) {
  204.                 dfs = this.getDateFormatSymbols(locale);
  205.             } else {    //no locale argument                        
  206.                 if (this.DateFormatSymbols == null) { //first call
  207.                     locale = (this.locale != null) ? this.locale : NOF.UTIL.DefaultLocale;
  208.                     this.DateFormatSymbols = this.getDateFormatSymbols(locale);
  209.                 }                
  210.                 dfs = this.DateFormatSymbols;
  211.             }
  212.             var pattern = this.getPattern();
  213.             if (pattern == null || pattern.trim().length == 0) {
  214.                 pattern = dfs.defaultPattern;
  215.             } 
  216.             
  217.             var localPatternChars = dfs.LocalPatternChars;
  218.             
  219.             var chPatternDate = new this.TEXT_CharsPatternDate(localPatternChars, this.PATTERN_CHARS);
  220.             
  221.             var pArr = this.parsePattern(pattern, localPatternChars);
  222.             
  223.             var pArrItem;
  224.             var str = "";
  225.             for (var i = 0; i < pArr.length; i++) {
  226.                 pArrItem = pArr[i];
  227.                 if (typeof(pArrItem) == 'string') {
  228.                     //alert("i == " + i + ", pArrItem == " + pArrItem);
  229.                     str += pArrItem;
  230.                 } else {
  231.                     //alert("i == " + i + ", pArrItem == " + pArrItem.ch + ", l==" + pArrItem.l);
  232.                     switch (pArrItem.ch) {
  233.                     case (chPatternDate.yearChar): {                        
  234.                         str += (""+year).substring(4 - pArrItem.l);
  235.                         break;                        
  236.                     }
  237.                     case (chPatternDate.monthChar): {
  238.                         if (pArrItem.l == 2) {
  239.                             if (month_in_year < 9) {
  240.                                 str += "0" + (month_in_year + 1);
  241.                                 break;
  242.                             }
  243.                         }
  244.                         str += (month_in_year + 1);                        
  245.                         break;                        
  246.                     }    
  247.                     case (chPatternDate.day_in_monthChar): {
  248.                         if (pArrItem.l == 2) {
  249.                             if (day_in_month < 10) {
  250.                                 str += "0" + day_in_month;
  251.                                 break;
  252.                             }
  253.                         }
  254.                         str += day_in_month;                        
  255.                         break;                        
  256.                     }    
  257.                     case (chPatternDate.hour_in_day0_23Char): {
  258.                         str += hours;
  259.                         break;                        
  260.                     }    
  261.                     case (chPatternDate.hour_in_day1_24Char): {
  262.                         str += hours;
  263.                         break;                        
  264.                     }    
  265.                     case (chPatternDate.hour_in_AmPm0_11Char): {
  266.                         str += (hours % 12);
  267.                         break;                        
  268.                     }    
  269.                     case (chPatternDate.hour_in_AmPm1_12Char): {
  270.                         str += (hours % 12);
  271.                         break;                        
  272.                     }    
  273.                     case (chPatternDate.minuteChar): {
  274.                         str += minutes;
  275.                         break;                        
  276.                     }    
  277.                     case (chPatternDate.secondChar): {
  278.                         str += seconds;
  279.                         break;                        
  280.                     }    
  281.                     case (chPatternDate.millisChar): {
  282.                         str += milliseconds;
  283.                         break;                        
  284.                     }    
  285.                     case (chPatternDate.markerAMPMChar): {
  286.                         //alert(dfs.AmPmMarkers);
  287.                         str += dfs.AmPmMarkers[parseInt(hours / 12)];
  288.                         break;                        
  289.                     }    
  290.                         
  291.                         
  292.                     }
  293.                 }
  294.             }
  295.             
  296.             
  297.             return str;                            
  298.         }
  299.         
  300.         /**
  301.         * Get a Date from a formatted string
  302.         * @param source
  303.         * @return the date
  304.         **/        
  305.         /*Date*/ method.parse    = function (/*String*/ source, /*NOF.UTIL.Locale*/ locale) {
  306.             if (source == null || source.trim().length == 0) {
  307.                 return null;
  308.             }
  309.             var date = new Date(0);
  310.             
  311.             var dfs = null;
  312.             if (locale != null) {
  313.                 dfs = this.getDateFormatSymbols(locale);
  314.             } else {    //no locale argument                        
  315.                 if (this.DateFormatSymbols == null) { //first call
  316.                     locale = (this.locale != null) ? this.locale : NOF.UTIL.DefaultLocale;
  317.                     this.DateFormatSymbols = this.getDateFormatSymbols(locale);
  318.                 }                
  319.                 dfs = this.DateFormatSymbols;
  320.             }
  321.             var pattern = this.getPattern();
  322.             if (pattern == null || pattern.trim().length == 0) {
  323.                 pattern = dfs.defaultPattern;
  324.             } 
  325.             
  326.             var localPatternChars = dfs.LocalPatternChars;
  327.             var chPatternDate = new this.TEXT_CharsPatternDate(localPatternChars, this.PATTERN_CHARS);            
  328.             
  329.             var pArr = this.parsePattern(pattern + " ", localPatternChars);
  330.             source += " ";
  331.             
  332.             var pArrItem;
  333.             var j, k = -1;
  334.             
  335.             
  336.             for (var i = 1; i < pArr.length; i++) {
  337.                 pArrItem = pArr[i];
  338.                 if (typeof(pArrItem) == 'string') {
  339.                     
  340.                     k = source.indexOf(pArrItem);
  341.                     if (k > -1) {
  342.                         tmpStr = source.substring(0, k);                        
  343.                         source = source.substring(k + pArrItem.length, source.length);
  344.                         
  345.                         //alert( " pArr[j] = |"+ pArr[i-1] + "|, tmpStr = |" + tmpStr + "|\r\n" +    "new source = |" + source + "|");
  346.                         
  347.                         if (typeof(pArr[i-1]) == 'object') {
  348.                             //this.setDateAttributes(date, tmpStr, pArr[i-1]);
  349.                             switch (pArr[i-1].ch) {
  350.                             case (chPatternDate.yearChar): {                                
  351.                                 var year = parseInt(tmpStr);
  352.                                 if (pArr[i-1].l < 4) {
  353.                                     if (year >= 70) {
  354.                                         year = 1900 + year;
  355.                                     } else {
  356.                                         year = 2000 + year;
  357.                                     }
  358.                                 } 
  359.                                 date.setYear(year);
  360.                                 //alert(" date.getYear " + date.getYear());
  361.                                 break;                        
  362.                             }
  363.                             case (chPatternDate.monthChar): {
  364.                                 var month = parseInt(tmpStr);
  365.                                 date.setMonth(month - 1); //?
  366.                                 break;                        
  367.                             }    
  368.                             case (chPatternDate.day_in_monthChar): {
  369.                                 var day_of_month = parseInt(tmpStr);
  370.                                 date.setDate(day_of_month); //?                                
  371.                                 break;                        
  372.                             }    
  373.                             case (chPatternDate.hour_in_day0_23Char): {
  374.                                 var hours = parseInt(tmpStr);
  375.                                 date.setHours(hours);
  376.                                 break;                        
  377.                             }    
  378.                             case (chPatternDate.hour_in_day1_24Char): {
  379.                                 var hours = parseInt(tmpStr);
  380.                                 date.setHours(hours);                                
  381.                                 break;                        
  382.                             }    
  383.                             case (chPatternDate.hour_in_AmPm0_11Char): {
  384.                                 var hours = parseInt(tmpStr);
  385.                                 date.setHours(hours);                                
  386.                                 break;                        
  387.                             }    
  388.                             case (chPatternDate.hour_in_AmPm1_12Char): {
  389.                                 var hours = parseInt(tmpStr);
  390.                                 date.setHours(hours);                                
  391.                                 break;                        
  392.                             }    
  393.                             case (chPatternDate.minuteChar): {
  394.                                 var minutes = parseInt(tmpStr);
  395.                                 date.setMinutes(minutes);                                
  396.                                 break;                        
  397.                             }    
  398.                             case (chPatternDate.secondChar): {
  399.                                 var seconds = parseInt(tmpStr);
  400.                                 date.setSeconds(seconds);                                                                
  401.                                 break;                        
  402.                             }    
  403.                             case (chPatternDate.millisChar): {
  404.                                 var milliseconds = parseInt(tmpStr);
  405.                                 date.setMilliseconds(milliseconds);    
  406.                                 break;                        
  407.                             }    
  408.                             case (chPatternDate.markerAMPMChar): {                                
  409.                                 var AmPm = tmpStr;
  410.                                 var hours = date.getHours();
  411.                                 if (AmPm == dfs.AmPmMarkers[0]) {
  412.                                     //?
  413.                                 } else {
  414.                                     date.setHours(hours + 12);
  415.                                 }
  416.                                 //alert("parse : date.getHours == " + date.getHours());
  417.                                 break;                        
  418.                             }    
  419.                                 
  420.                             } //end switch
  421.                             
  422.                         }
  423.                     }
  424.                 }
  425.             }
  426.             return date;
  427.         }
  428.         
  429.         
  430.         /**
  431.         * 
  432.         * @param pattern
  433.         * @param patternChars
  434.         * @return 
  435.         **/        
  436.         /*Array*/ method.parsePattern    = function (/*String*/ pattern, /*String*/ patternChars) {
  437.             var pArr = [];
  438.             if ((pattern != null) && (pattern.trim().length > 0)) {
  439.                 
  440.                 var chI;
  441.                 for (var i=0; i < pattern.length; /*i++*/) {
  442.                     chI = pattern.charAt(i);
  443.                     //deal first with comments
  444.                     if (chI == "'") {                        
  445.                         var qIndex = pattern.indexOf("'", i+1);
  446.                         if (qIndex < 0) {
  447.                             throw new NOF.UTIL.Exception("invalid_pattern");
  448.                         }
  449.                         
  450.                         if (qIndex + 1 < pattern.length) {
  451.                             if (pattern.charAt(qIndex + 1) == "'") { //we have an escape '
  452.                                 qIndex = pattern.indexOf("'", qIndex + 2); //search forward
  453.                                 if (qIndex < 0) {
  454.                                     throw new NOF.UTIL.Exception("invalid_pattern");
  455.                                 }                                
  456.                             }
  457.                         }
  458.                         
  459.                         pArr[pArr.length] = pattern.substring(i, qIndex + 1);
  460.                         i = qIndex + 1;
  461.                         //continue;
  462.                         
  463.                     } else {
  464.                         
  465.                         if (patternChars.indexOf(chI) > -1) { //reserved char
  466.                             var obj = new Object();
  467.                             obj.ch = chI;
  468.                             var j = 1;
  469.                             while (pattern.charAt(i + j) == chI) {
  470.                                 j++;
  471.                             }
  472.                             obj.l = j;
  473.                             pArr[pArr.length] = obj;
  474.                             i = i + j;
  475.                             //continue;
  476.                         } else { //separators, spaces
  477.                             //alert(chI + "=chI, i = " +i);
  478.                             
  479.                             var tmpStr = chI;
  480.                             var chIJ;
  481.                             var j = 0;
  482.                             for (;;) {
  483.                                 j++;
  484.                                 if (i + j >= pattern.length) {
  485.                                     break;
  486.                                 }
  487.                                 chIJ = pattern.charAt(i + j);
  488.                                 if( (patternChars.indexOf( chIJ ) < -1) && (chIJ != "'") ) { //is not reserved char
  489.                                     tmpStr += chIJ;
  490.                                 } else {
  491.                                     //j++;
  492.                                     break;
  493.                                 }
  494.                             }
  495.                             pArr[pArr.length] = tmpStr;
  496.                             i = i + j;
  497.                             //continue;
  498.                         }
  499.                     }
  500.                 }
  501.             }
  502.             return pArr;
  503.         }        
  504.     }
  505.     // add it to NOF.TEXT namespace    
  506.     TEXT.__proto__.DateFormat = TEXT_DateFormat;
  507.     
  508. }